<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>查询时输入即搜索 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/_query_time_search_as_you_type.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/_query_time_search_as_you_type.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/_query_time_search_as_you_type.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/_query_time_search_as_you_type.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="search-in-depth.html">深入搜索</a></span>
»
<span class="breadcrumb-link"><a href="partial-matching.html">部分匹配</a></span>
»
<span class="breadcrumb-node">查询时输入即搜索</span>
</div>
<div class="navheader">
<span class="prev">
<a href="_wildcard_and_regexp_queries.html">« 通配符与正则表达式查询</a>
</span>
<span class="next">
<a href="_index_time_optimizations.html">索引时优化 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="_query_time_search_as_you_type"></a>查询时输入即搜索<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/130_Partial_Matching/20_Match_phrase_prefix.asciidoc">edit</a>
</h2>
</div></div></div>
<p>把邮编的事情先放一边，让我们先看看前缀查询是如何在全文查询中起作用的。用户已经渐渐习惯在输完查询内容之前，就能为他们展现搜索结果，这就是所谓的 <em>即时搜索（instant search）</em> 或 <em>输入即搜索（search-as-you-type）</em> 。不仅用户能在更短的时间内得到搜索结果，我们也能引导用户搜索索引中真实存在的结果。</p>
<p>例如，如果用户输入 <code class="literal">johnnie walker bl</code> ，我们希望在它们完成输入搜索条件前就能得到：Johnnie Walker Black Label 和 Johnnie Walker Blue Label 。</p>
<p>生活总是这样，就像猫的花色远不只一种！我们希望能找到一种最简单的实现方式。并不需要对数据做任何准备，在查询时就能对任意的全文字段实现 <em>输入即搜索（search-as-you-type）</em> 的查询。</p>
<p>在 <a class="xref" href="phrase-matching.html" title="短语匹配">短语匹配</a> 中，我们引入了 <code class="literal">match_phrase</code> 短语匹配查询，它匹配相对顺序一致的所有指定词语，对于查询时的输入即搜索，可以使用 <code class="literal">match_phrase</code> 的一种特殊形式， <code class="literal">match_phrase_prefix</code> 查询：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">{
    "match_phrase_prefix" : {
        "brand" : "johnnie walker bl"
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/130_Partial_Matching/20_Match_phrase_prefix.json"></div>
<p>这种查询的行为与 <code class="literal">match_phrase</code> 查询一致，不同的是它将查询字符串的最后一个词作为前缀使用，换句话说，可以将之前的例子看成如下这样：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">johnnie</code>
</li>
<li class="listitem">
跟着 <code class="literal">walker</code>
</li>
<li class="listitem">
跟着以 <code class="literal">bl</code> 开始的词
</li>
</ul>
</div>
<p>如果通过 <code class="literal">validate-query</code> API 运行这个查询查询，explanation 的解释结果为：</p>
<pre class="literallayout">"johnnie walker bl*"</pre>

<p>与 <code class="literal">match_phrase</code> 一样，它也可以接受 <code class="literal">slop</code> 参数（参照 <a class="xref" href="slop.html" title="混合起来">slop</a> ）让相对词序位置不那么严格：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">{
    "match_phrase_prefix" : {
        "brand" : {
            "query": "walker johnnie bl", <a id="CO94-1"></a><i class="conum" data-value="1"></i>
            "slop":  10
        }
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/130_Partial_Matching/20_Match_phrase_prefix.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO94-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>尽管词语的顺序不正确，查询仍然能匹配，因为我们为它设置了足够高的 <code class="literal">slop</code> 值使匹配时的词序有更大的灵活性。</p>
</td>
</tr>
</table>
</div>
<p>但是只有查询字符串的最后一个词才能当作前缀使用。</p>
<p>在之前的 <a class="xref" href="prefix-query.html" title="prefix 前缀查询">前缀查询</a> 中，我们警告过使用前缀的风险，即 <code class="literal">prefix</code> 查询存在严重的资源消耗问题，短语查询的这种方式也同样如此。前缀 <code class="literal">a</code> 可能会匹配成千上万的词，这不仅会消耗很多系统资源，而且结果的用处也不大。</p>
<p>可以通过设置 <code class="literal">max_expansions</code> 参数来限制前缀扩展的影响，一个合理的值是可能是 50 ：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">{
    "match_phrase_prefix" : {
        "brand" : {
            "query":          "johnnie walker bl",
            "max_expansions": 50
        }
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/130_Partial_Matching/20_Match_phrase_prefix.json"></div>
<p>参数 <code class="literal">max_expansions</code> 控制着可以与前缀匹配的词的数量，它会先查找第一个与前缀 <code class="literal">bl</code> 匹配的词，然后依次查找搜集与之匹配的词（按字母顺序），直到没有更多可匹配的词或当数量超过 <code class="literal">max_expansions</code> 时结束。</p>
<p>不要忘记，当用户每多输入一个字符时，这个查询又会执行一遍，所以查询需要快，如果第一个结果集不是用户想要的，他们会继续输入直到能搜出满意的结果为止。</p>
</div>
<div class="navfooter">
<span class="prev">
<a href="_wildcard_and_regexp_queries.html">« 通配符与正则表达式查询</a>
</span>
<span class="next">
<a href="_index_time_optimizations.html">索引时优化 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>